var request = require('request');
var xml2js = require('xml2js');
var config = require('../config'); //获取配置文件信息


//prepay_id 的获取，以及签名 paySign 的获取。
//获取签名
exports.paysignjsapi = function (appid, mch_id, nonce_str, body, out_trade_no, total_fee, spbill_create_ip, notify_url, trade_type, limit_pay, openid) {//统一下单签名  
    var ret = {
        appid: appid,
        mch_id: mch_id,
        nonce_str: nonce_str,
        body: body,
        out_trade_no: out_trade_no,
        total_fee: total_fee,
        spbill_create_ip: spbill_create_ip,
        notify_url: notify_url,
        trade_type: trade_type,
        limit_pay: limit_pay,
        openid: openid
    };
    var string = raw(ret);
    var key = config.key;
    string = string + '&key=' + key;  //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置  
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase();
};

//字典排序
function raw(args) {
    var keys = Object.keys(args);
    keys = keys.sort()
    var newArgs = {};
    keys.forEach(function (key) {
        newArgs[key] = args[key];
    });
    var string = '';
    for (var k in newArgs) {
        string += '&' + k + '=' + newArgs[k];
    }
    string = string.substr(1);
    //console.log(string);  
    return string;
};

//josn转换xml数据
function buildXML(json) {
    var builder = new xml2js.Builder();
    return builder.buildObject(json);
};

//二次签名
exports.paySignTwo = function (appId, nonceStr, package, signType, timeStamp) {//参数名不可改，必须严格一模一样
    var ret = {
        appId: appId,
        timeStamp: timeStamp,
        nonceStr: nonceStr,
        package: package,
        signType: signType,
    };
    var string = raw(ret);
    var key = config.key;//商户密钥
    string = string + '&key=' + key;  //key
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase();
};

//随机32位字符串
exports.random32 = function (str) {
    var len = 32
    var strlength = str.length
    var ss = "";
    for (var i = 0; i < len; i++) {
        ss += str.charAt(Math.floor(Math.random() * strlength));
    }
    return ss;
}

//订单号生成
exports.getWxPayOrdrID = function () {
    // 生成商户订单号
    var myDate = new Date();
    var year = myDate.getFullYear();
    var mouth = myDate.getMonth() + 1;
    var day = myDate.getDate();
    var hour = myDate.getHours();
    var minute = myDate.getMinutes();
    var second = myDate.getSeconds();
    var msecond = myDate.getMilliseconds(); //获取当前毫秒数(0-999)
    if (mouth < 10) { /*月份小于10  就在前面加个0*/
        mouth = String(String(0) + String(mouth));
    }
    if (day < 10) { /*日期小于10  就在前面加个0*/
        day = String(String(0) + String(day));
    }
    if (hour < 10) { /*时小于10  就在前面加个0*/
        hour = String(String(0) + String(hour));
    }
    if (minute < 10) { /*分小于10  就在前面加个0*/
        minute = String(String(0) + String(minute));
    }
    if (second < 10) { /*秒小于10  就在前面加个0*/
        second = String(String(0) + String(second));
    }
    if (msecond < 10) {
        msecond = String(String(00) + String(second));
    } else if (msecond >= 10 && msecond < 100) {
        msecond = String(String(0) + String(second));
    }
    var currentDate = String(year) + String(mouth) + String(day) + String(hour) + String(minute) + String(second) + String(msecond);
    return currentDate;
};

//查询订单 不需要证书orderquery
//   需要调用查询接口的情况：
//  ◆ 当商户后台、网络、服务器等出现异常，商户系统最终未接收到支付通知；
//  ◆ 调用支付接口后，返回系统错误或未知交易状态情况；
//  ◆ 调用被扫支付API，返回USERPAYING的状态；
//  ◆ 调用关单或撤销接口API之前，需确认支付状态；
exports.orderquery = function (req, res) {
    var appid = ""	    //是	String(32)	wxd678efh567hg6787	微信分配的小程序ID
    var mch_id = ""     //是	String(32)	1230000109	微信支付分配的商户号
    var transaction_id = ""	//二选一	String(32)	1009660380201506130728806387	微信的订单号，优先使用
    var nonce_str = ""	  //是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	随机字符串，不长于32位。推荐随机数生成算法
    var sign = ""	      //是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	签名，详见签名生成算法
    var ign_type = ""	 //否	String(32)	HMAC-SHA256	签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
}


//关闭订单 不需要证书closeorder
exports.closeorder = function (req, res) {
    var appid = "";//	是	String(32)	wx8888888888888888	微信分配的小程序ID
    var mch_id = "";//		是	String(32)	1900000109	微信支付分配的商户号
    var out_trade_no = "";//		是	String(32)	1217752501201407033233368018	商户系统内部的订单号
    var nonce_str = "";//		是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	商户系统内部的订单号,32个字符内、可包含字母, 其他说明见安全规范
    var sign = "";//		是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	签名，详见签名生成算法
    var sign_type = "";//		否	String(32)	HMAC-SHA256	签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
}


//申请退款 请求需要双向证书。refund
exports.refund = function (req, res) {
    var appid = ""//	是	String(32)	wx8888888888888888	微信分配的小程序ID
    var mch_id = ""//	是	String(32)	1900000109	微信支付分配的商户号
    var device_info = ""//	否	String(32)	013467007045764	终端设备号
    var nonce_str = ""//	是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	随机字符串，不长于32位。推荐随机数生成算法
    var sign = ""//	是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	签名，详见签名生成算法
    var sign_type = ""//	否	String(32)	HMAC-SHA256	签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
    var transaction_id = ""//	二选一	String(28)	1217752501201407033233368018	微信生成的订单号，在支付通知中有返回
    var out_trade_no = ""//	String(32)	1217752501201407033233368018	商户侧传给微信的订单号
    var out_refund_no = ""//	是	String(64)	1217752501201407033233368018	商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔
    var total_fee = ""//	是	Int	100	订单总金额，单位为分，只能为整数，详见支付金额
    var refund_fee = ""//	是	Int	100	退款总金额，订单总金额，单位为分，只能为整数，详见支付金额
    var refund_fee_type = ""//	否	String(8)	CNY	货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
    var op_user_id = ""//	是	String(32)	1900000109	操作员帐号, 默认为商户号
    var refund_account = ""//	否	String(30)	REFUND_SOURCE_RECHARGE_FUNDS	

}

//查询退款 不需要证书refundquery
exports.refundquery = function (req, res) {
    var appid = "";//	是	String(32)	wx8888888888888888	微信分配的小程序ID
    var mch_id = "";//	是	String(32)	1900000109	微信支付分配的商户号
    var device_info = "";//	否	String(32)	013467007045764	商户自定义的终端设备号，如门店编号、设备的ID等
    var nonce_str = "";//	是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	随机字符串，不长于32位。推荐随机数生成算法
    var sign = "";//	是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	签名，详见签名生成算法
    var sign_type = "";//	否	String(32)	HMAC-SHA256	签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
    var transaction_id = "";//	四选一	String(32)	1217752501201407033233368018	微信订单号查询的优先级是： refund_id > out_refund_no > transaction_id > out_trade_no

}

//下载对账单 不需要证书downloadbill
exports.downloadbill = function (req, res) {
    var appid = "1111";//	是	String(32)	wx8888888888888888	微信分配的小程序ID
    var mch_id = "";//	是	String(32)	1900000109	微信支付分配的商户号
    var device_info = "";//	否	String(32)	013467007045764	微信支付分配的终端设备号
    var nonce_str = "";//	是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	随机字符串，不长于32位。推荐随机数生成算法
    var sign = "";//	是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	签名，详见签名生成算法
    var sign_type = "";//	否	String(32)	HMAC-SHA256	签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
    var bill_date = "";//	是	String(8)	20140603	下载对账单的日期，格式：20140603
    var bill_type = "";//	是	String(8)	ALL	
    var tar_type = "";//	否	String(8)	GZIP	非必传参数，固定值：GZIP，返回格式为.gzip的压缩包账单。不传则默认为数据流形式。
    var s = this.getWxPayOrdrID();
    return s;
}


//交易保障 不需要证书report
exports.report = function (req, res) {


}


//拉取订单评价数据 需要证书batchquerycomment
exports.batchquerycomment = function (appid,mch_id,nonce_str,begin_time,end_time,offset,limit){
    var ret = {
        appid: appid,
        mch_id: mch_id,
        nonce_str: nonce_str,
        begin_time: begin_time,
        end_time: end_time,
        offset: offset,
        end_tlimitime: limit,
    };
    var string = raw(ret);
    var key = config.key;
    string = string + '&key=' + key;  //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置  
    var crypto = require('crypto');
    return crypto.createHash('sha256').update(string, 'utf8').digest('hex').toUpperCase();
}




